﻿#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include"ctype.h"

void _tmp_code();

/*
code1
描述
写出一个程序，接受一个由字母、数字和空格组成的字符串，和一个字符，然后输出输入字符串中该字符的出现次数。（不区分大小写字母）

数据范围： 1 \le n \le 1000 \1≤n≤1000
输入描述：
第一行输入一个由字母和数字以及空格组成的字符串，第二行输入一个字符。

输出描述：
输出输入字符串中含有该字符的个数。（不区分大小写字母）
*/
void code1(void)
{
	char str[2][1000] = {0};
	int num = 2;
	int i = 0;
	int ret = 0;
	while (num--)
		gets(str[i++]);
	//str[0] = "655b203khDc79w76239SC60Yx5O634244O8oNKw2g5c122dt9M17197FQ9fR0fC8619q00cC156NJQ958ZAH8qe76G024Xvy74ETiO10WgQmOuNx104B9L8Euod682x6hVX941DUalUwb20nyD6IX6IM57Jvypu2mtZ8fpk9Z72AU9g0zob32W7J427VT50P7x40d6QF1067yYMioy6E037e2fTDTse6Z983873849KSB3t93t1wR14717iDi9ybw76h9410q345Z4882zWY3v7C0jD33NlLiF53Hp69067Dzvu1s4Er0G24MhcAHEq151Y339jyfbP6w9j1dX72DEv7L02764f2K7XVf7tWNYGqU5iNlS5RpV619vg7zR96D8jMsO5xN223W97CMuHHWBX806AD732q42h1bwpSb923V3Q73D3g3O0100tk948693d67nxrd7LB6He5O9qG2i9xJ0U1x9054y20039V9uD61HF9eP825JJ79M200X3zH1pW99QeG40kR4275p5P96S3J6mj60z278C1K685As6CX35rcY70qI5810i3rt5WB1C6H74118433Z8wsfE9s2M82q7TN7Q6Zz3047W99g56kLK58NqPfSuhSfEs0W4u1D720A3jqpG7aD0Be3N18395zS037T0Rg47K3O90H5w5660bNW58O8TK3l38xyN7R36kH4l21VYDx3waZK8kf5O3ySWJQdN7eVnf778GIa70Fan34v0owxkg4N5keNbaxh044l67Vimm110i7N8614Xj4667rQd6R67aHlm5z6N51jtbAm22305l9p83Uu6l8pBOaxQL56c5M76SUUKv9538FVD28WT1046sPQ1eHf5e65tk3Q6Lub314FBNv2C4Q12e6oPcX95jC06g8oFj7q7V20ciEO73m00U8v8342H1w86yS298r094x2y8O24e8p6j685D9a539930DQ6s6813uF8D34i6E1x5j2v9";
	strcpy(str[0], "655b203khDc79w76239SC60Yx5O634244O8oNKw2g5c122dt9M17197FQ9fR0fC8619q00cC156NJQ958ZAH8qe76G024Xvy74ETiO10WgQmOuNx104B9L8Euod682x6hVX941DUalUwb20nyD6IX6IM57Jvypu2mtZ8fpk9Z72AU9g0zob32W7J427VT50P7x40d6QF1067yYMioy6E037e2fTDTse6Z983873849KSB3t93t1wR14717iDi9ybw76h9410q345Z4882zWY3v7C0jD33NlLiF53Hp69067Dzvu1s4Er0G24MhcAHEq151Y339jyfbP6w9j1dX72DEv7L02764f2K7XVf7tWNYGqU5iNlS5RpV619vg7zR96D8jMsO5xN223W97CMuHHWBX806AD732q42h1bwpSb923V3Q73D3g3O0100tk948693d67nxrd7LB6He5O9qG2i9xJ0U1x9054y20039V9uD61HF9eP825JJ79M200X3zH1pW99QeG40kR4275p5P96S3J6mj60z278C1K685As6CX35rcY70qI5810i3rt5WB1C6H74118433Z8wsfE9s2M82q7TN7Q6Zz3047W99g56kLK58NqPfSuhSfEs0W4u1D720A3jqpG7aD0Be3N18395zS037T0Rg47K3O90H5w5660bNW58O8TK3l38xyN7R36kH4l21VYDx3waZK8kf5O3ySWJQdN7eVnf778GIa70Fan34v0owxkg4N5keNbaxh044l67Vimm110i7N8614Xj4667rQd6R67aHlm5z6N51jtbAm22305l9p83Uu6l8pBOaxQL56c5M76SUUKv9538FVD28WT1046sPQ1eHf5e65tk3Q6Lub314FBNv2C4Q12e6oPcX95jC06g8oFj7q7V20ciEO73m00U8v8342H1w86yS298r094x2y8O24e8p6j685D9a539930DQ6s6813uF8D34i6E1x5j2v9");
	strcpy(str[1], "1");
	//tolower(str[0]);
	//tolower(str[1]);
	for (i = 0; i < strlen(str[0]); i++)
	{
#if 0
		if (((str[1][0] + 32) == str[0][i] || (str[1][0] - 32 == str[0][i]))
			&& (64 < str[0][i] && 91 > str[0][i] || 96 < str[0][i] && 123 > str[0][i]))
			ret++;
		else 
#endif
		if (tolower(str[1][0]) == tolower(str[0][i]))
			ret++;
		printf("%c", tolower(str[0][i]));
	}
	printf("%c", tolower(str[1][0]));
	printf("%d\n", ret);
}

/*
明明生成了NN个1到500之间的随机整数。请你删去其中重复的数字，即相同的数字只保留一个，把其余相同的数去掉，然后再把这些数从小到大排序，按照排好的顺序输出。

数据范围： 1 \le n \le 1000 \1≤n≤1000  ，输入的数字大小满足 1 \le val \le 500 \1≤val≤500
输入描述：
第一行先输入随机整数的个数 N 。 接下来的 N 行每行输入一个整数，代表明明生成的随机数。 具体格式可以参考下面的"示例"。
输出描述：
输出多行，表示输入数据处理后的结果

###多行输入
*/

void code2(void)
{
	int input_cnt = 0;
	int input_radom_num[1000] = {0};
	int i = 0;
	int hash_code[500] = {0};
	int radom_num_cnt = 0;

	scanf("%d", &input_cnt);

	while (input_cnt--)
	{
		scanf("%d", &input_radom_num[i++]);
	}

	radom_num_cnt = i;

	for (i = 0; i < radom_num_cnt; i++)
	{
		hash_code[input_radom_num[i]]++;
	}

	for (i = 0; i < 500; i++)
	{
		if (hash_code[i] >= 1)
			printf("%d\n", i);
	}
}
/*
描述
•输入一个字符串，请按长度为8拆分每个输入字符串并进行输出；

•长度不是8整数倍的字符串请在后面补数字0，空字符串不处理。
输入描述：
连续输入字符串(每个字符串长度小于等于100)

输出描述：
依次输出所有分割后的长度为8的新字符串
*/
void code3()
{
	char str[100] = {'0'};
	int last_len = 0;
	int multiple = 0;
	int i = 0;
	int j = 0;
	scanf("%s", str);

	last_len = strlen(str) % 8;
	multiple = strlen(str) / 8;
	if (strlen(str) < 8)
		goto min_print;
	else
	{
		for (i = 0; i < multiple; i++)
		{
			for (j = 0; j < 8; j++)
			{
				printf("%c", str[i * 8 + j]);
			}
			printf("\n");
		}
		if (last_len == 0)
			return;
	}

min_print:
	
	for (i = 0; i < last_len; i++)
	{
		printf("%c", str[multiple * 8 + i]);
	}
	for (i = 0; i < 8 - last_len; i++)
	{
		printf("0");
	}
}
/*
描述
写出一个程序，接受一个十六进制的数，输出该数值的十进制表示。

数据范围：保证结果在 1 \le n \le 2^{31}-1 \1≤n≤2
31
−1
输入描述：
输入一个十六进制的数值字符串。

输出描述：
输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例1
输入：
0xAA
复制
输出：
170
*/
void code4()
{
	char hash[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
	char source_num[8];
	int wight[8];
	int i;
	int j = 0;
	int ret = 0;
	scanf("%s", source_num);
	sscanf(source_num, "0x%s", source_num);
	for (i = 0; i < strlen(source_num); i++)
	{
		for (j = 0; j < 16; j++)
		{
			if (source_num[i] == hash[j])
				wight[i] = j;
		}
	}
	for (j = 0; j < strlen(source_num); j++)
	{
		ret += wight[j] * pow(16, (strlen(source_num) - j - 1));
	}
	printf("%d\n", ret);
}

/*
描述
计算字符串最后一个单词的长度，单词以空格隔开，字符串长度小于5000。（注：字符串末尾不以空格为结尾）
输入描述：
输入一行，代表要计算的字符串，非空，长度小于5000。

输出描述：
输出一个整数，表示输入字符串最后一个单词的长度。

示例1
输入：
hello nowcoder
复制
输出：
8
复制
说明：
最后一个单词为nowcoder，长度为8   
*/
void code5()
{
	char str[5000];
	int i = 0;
	int space_index = -1;
	gets(str);

	for (i = 0; i < strlen(str); i++)
	{
		if (str[i] == ' ')
			space_index = i;
	}
	if (space_index < 0)
		printf("%d\n", strlen(str));
	else
		printf("%d\n", strlen(str) - space_index - 1);
}

/*
描述
数据表记录包含表索引index和数值value（int范围的正整数），请对表索引相同的记录进行合并，即将相同索引的数值进行求和运算，输出按照index值升序进行输出。


提示:
0 <= index <= 11111111
1 <= value <= 100000

输入描述：
先输入键值对的个数n（1 <= n <= 500）
接下来n行每行输入成对的index和value值，以空格隔开

输出描述：
输出合并后的键值对（多行）
*/

void code6()
{
	int map[500][2] = {0};
	int new_map[500][2] = { 0 };
	char tmp_str[3];
	int tmp_map[1][2];
	int N = 0;
	int i, j = 0;
	int new_len = 0;
	
	scanf("%d", &N);
	i = N;
	do 
	{
		scanf("%d %d", &map[i - 1][0], &map[i - 1][1]);
		//gets(tmp_str);
		//sscanf(tmp_str, "%d %d", map[N - 1][0], map[N - 1][1]);
	} while (--i);

	for (i = 0; i < N - 1; i++)
	{
		for (j = i + 1; j < N; j++)
		{
			if (map[i][0] > map[j][0])
			{
				tmp_map[0][0] = map[i][0];
				tmp_map[0][1] = map[i][1];
				map[i][0] = map[j][0];
				map[i][1] = map[j][1];
				map[j][0] = tmp_map[0][0];
				map[j][1] = tmp_map[0][1];

			}
		}
	}
	memcpy(new_map[0], map[0], 8);
	//new_map[0] = map[0];
	for (i = 1; i < N; i++)
	{
		if (map[i][0] == new_map[new_len][0])
			new_map[new_len][1] += map[i][1];
		else
			memcpy(new_map[++new_len], map[i], 8);
	}
	for (i = 0; i <= new_len; i++)
	{
		printf("%d %d", new_map[i][0], new_map[i][1]);
		printf("\n");
	}

}

/*
描述
输入一个 int 型整数，按照从右向左的阅读顺序，返回一个不含重复数字的新的整数。
保证输入的整数最后一位不是 0 。

数据范围： 1 \le n \le 10^{8} \1≤n≤10
8

输入描述：
输入一个int型整数

输出描述：
按照从右向左的阅读顺序，返回一个不含重复数字的新的整数
*/
void code7()
{
	int num = 0;
	int nums[10];
	int i = 0;
	scanf("%d", &num);

	while (num > 0)
	{	
		if (nums[num % 10] == num % 10)
			num /= 10;
		else
		{
			nums[num % 10] = num % 10;
			printf("%d", num % 10);
		}
	}
}

/*
描述
编写一个函数，计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ，包括 0 和 127 )，换行表示结束符，不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次
例如，对于字符串 abaca 而言，有 a、b、c 三种不同的字符，因此输出 3 。

数据范围： 1 \le n \le 500 \1≤n≤500 
输入描述：
输入一行没有空格的字符串。

输出描述：
输出 输入字符串 中范围在(0~127，包括0和127)字符的种数。
*/
void code8()
{
	char str[500];
	int ascii[127];
	int i = 0;
	int res = 0;
	gets(str);
	for (i = 0; i < strlen(str); i++)
		ascii[str[i]] = -1;
	for (i = 0; i < 127; i++)
	{
		if (ascii[i] == -1)
			res++;
	}
	printf("%d", res);
}

/*
描述
输入一个整数，将这个整数以字符串的形式逆序输出
程序不考虑负数的情况，若数字含有0，则逆序形式也含有0，如输入为100，则输出为001


数据范围： 0 \le n \le 2^{30}-1 \0≤n≤2
30
−1
输入描述：
输入一个int整数

输出描述：
将这个整数以字符串的形式逆序输出
*/
void code9()
{
	int num = 0;
	scanf("%d", &num);
	if (num == 0)
		printf("%d\n", num);
	while (num > 0)
	{
		printf("%d", num % 10);
		num /= 10;
	}
}

/*
描述
接受一个只包含小写字母的字符串，然后输出该字符串反转后的字符串。（字符串长度不超过1000）

输入描述：
输入一行，为一个只包含小写字母的字符串。

输出描述：
输出该字符串反转后的字符串。

示例1
输入：
abcd
复制
输出：
dcba
*/
void code10()
{
	char str[1000];
	gets(str);
	int i = 0;
	for (i = strlen(str) - 1; i >= 0; i--)
	{
		printf("%c", str[i]);
	}
	printf("\n");
}

/*
描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”，逆序排放后为“boy a am I”

所有单词之间用一个空格隔开，语句中除了英文字母外，不再包含其他字符

数据范围：输入的字符串长度满足 1 \le n \le 1000 \1≤n≤1000

注意本题有多组输入
输入描述：
输入一个英文语句，每个单词用空格隔开。保证输入只包含空格和字母。

输出描述：
得到逆序的句子

示例1
输入：
I am a boy
复制
输出：
boy a am I
复制
示例2
输入：
nowcoder
复制
输出：
nowcoder
*/

void code11()
{
	char str[1000];
	char str1[1000][100];
	int i = 0, j = 0, k = 0;
	gets(str);
	for (i = 0; i < strlen(str); i++)
	{
		if (str[i] == ' ')
		{
			str1[j][k] = '\0';
			j++;
			k = 0;
			continue;
		}
		str1[j][k++] = str[i];
	}
	str1[j][k] = '\0';

	for (i = j, k = 0; i >= 0; i--)
	{
		while (str1[i][k] != '\0')
		{
			printf("%c", str1[i][k++]);
		}
		printf(" ");
		k = 0;
	}
	
}

/*
描述
给定 n 个字符串，请对 n 个字符串按照字典序排列。

数据范围： 1 \le n \le 1000 \1≤n≤1000  ，字符串长度满足 1 \le len \le 100 \1≤len≤100
输入描述：
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
输出描述：
数据输出n行，输出结果为按照字典序排列的字符串。
示例1
输入：
9
cap
to
cat
card
two
too
up
boat
boot
复制
输出：
boat
boot
cap
card
cat
to
too
two
up
*/
void code12()
{
	char str[123][100];
	char tmp_str[100];
	int N = 0, i = 0, j = 0;
	memset(str, 0, 123 * 100);
	scanf("%d", &N);
	i = N;
	while (i--)
	{
		scanf("%s", tmp_str);
		strcpy(str[tmp_str[0]], tmp_str);
	}
	for (i = 65, j = 97; i < 91, j < 123; i++, j++)
	{
		if (str[i][0] != '\0')
			puts(str[i]);
		else if (str[j][0] != '\0')
			puts(str[j]);
	}
}

/*
输入一个 int 型的正整数，计算出该 int 型数据在内存中存储时 1 的个数。

数据范围：保证在 32 位整型数字范围内
输入描述：
输入一个整数（int类型）

输出描述：
这个数转换成2进制后，输出1的个数
*/
void code13()
{
	int num = 0;
	int cnt = 0;
	scanf("%d", &num);
	while (num != 0)
	{
		if ((num % 2) != 0)
			cnt++;
		num /= 2;
	}
	printf("%d/n", cnt);
}

int main(void)
{
	//code1();
	//code2();
	//code3();
	//code4();
	//code5();
	//code6();
	//code7();
	//code8();
	//code9();
	//code12();
	code13;

	//_tmp_code();
	//printf("%d %d", 12345 / 10, 12345 % 10);

	return 0;
}

void _tmp_code()
{
	/*
	int a[10] = { 9, 8, 7, 6, 5, 4, 3, 1, 23, 1 };
	int i, j;
	int tmp = 0;
	for (i = 0; i < 9; i++)
	{
		for (j = 1; j < 10; j++)
		{
			if (a[i] > a[j])
			{
				tmp = a[i];
				a[i] = a[j];
				a[j] = tmp;
			}
		}
	}

	for (i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	*/
	int num = 12345;
	int i;
	for (i = 0; i < 5; i++)
	{
		printf("%d ", num % 10);
		num /= 10;
	}
}